package com.aischool.utils;

import java.sql.Timestamp;
import java.text.ParseException;
import java.text.ParsePosition;
import java.text.SimpleDateFormat;
import java.util.Date;

public class DateUtil {
	public static final String[] months = { "一月", "二月", "三月", "四月", "五月", "六月",
		     "七月", "八月", "九月", "十月", "十一月", "十二月", };

	public static final String[] quarters = { "一季度", "二季度", "三季度", "四季度" };

    public DateUtil() {
    }

    /**
     * 获取日期字符串。
     * 
     * <pre>
     *  日期字符串格式： yyyyMMdd
     *  其中：
     *      yyyy   表示4位年。
     *      MM     表示2位月。
     *      dd     表示2位日。
     * </pre>
     * 
     * @return String "yyyyMMdd"格式的日期字符串。
     */
    public static String getDate() {
    	SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMdd");
    	return formatter.format(new Date());
    }

    /**
     * 获取当前年度字符串。
     * 
     * <pre>
     *  日期字符串格式： yyyy
     *  其中：
     *      yyyy   表示4位年。
     * </pre>
     * 
     * @return String "yyyy"格式的当前年度字符串。
     */
    public static String getNowYear() {
    	SimpleDateFormat formatter = new SimpleDateFormat("yyyy");
    	return formatter.format(new Date());
    }

    /**
     * 获取当前月度字符串。
     * 
     * <pre>
     *  日期字符串格式： MM
     *  其中：
     *      MM   表示4位年。
     * </pre>
     * 
     * @return String "yyyy"格式的当前月度字符串。
     */
    public static String getNowMonth() {
    	SimpleDateFormat formatter = new SimpleDateFormat("MM");
    	return formatter.format(new Date());
    }

    /**
     * 获取当前月度字符串。
     * 
     * <pre>
     *  日期字符串格式： dd
     *  其中：
     *      dd   表示4位年。
     * </pre>
     * 
     * @return String "yyyy"格式的当前月度字符串。
     */
    public static String getNowDay() {
    	SimpleDateFormat formatter = new SimpleDateFormat("dd");
    	return formatter.format(new Date());
    }

    /**
     * 获取日期字符串。
     * 
     * <pre>
     *  日期字符串格式： yyyyMMdd
     *  其中：
     *      yyyy   表示4位年。
     *      MM     表示2位月。
     *      dd     表示2位日。
     * </pre>
     * 
     * @param date
     *                需要转化的日期。
     * @return String "yyyy-MM-dd"格式的日期字符串。
     */
    public static String getDate(Date date) {
    	SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
    	return formatter.format(date);
    }
    
    public static String getDate(Date date, String formatString) {
    	SimpleDateFormat formatter = new SimpleDateFormat(formatString);
    	return formatter.format(date);
    }
    
    public static String getDate(String dateString, String formatString) {
    	try  
    	{  
    	    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");  
    	    Date date = sdf.parse(dateString); 
    	    return getDate(date, formatString);
    	}  
    	catch (ParseException e)  
    	{  
    	    System.out.println(e.getMessage());  
    	} 
    	return dateString;
    }

    
    public static String getDateTime(Date date, String formatString) {
    	SimpleDateFormat formatter = new SimpleDateFormat(formatString);
    	return formatter.format(date);
    }
    
    public static String getDateTime(Date date) {
    	return getDateTime(date, "yyyy-MM-dd HH:mm:ss");
    }

    public static String getDateTime(String dateString, String formatString) {
    	try  
    	{  
    	    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
    	    Date date = sdf.parse(dateString); 
    	    return getDateTime(date, formatString);
    	}  
    	catch (ParseException e)  
    	{  
    	    System.out.println(e.getMessage());  
    	} 
    	return dateString;
    }
    

    /**
     * 获取日期字符串。
     * 
     * <pre>
     *  日期字符串格式： yyyy-MM-dd
     *  其中：
     *      yyyy   表示4位年。
     *      MM     表示2位月。
     *      dd     表示2位日。
     * </pre>
     * 
     * @return String "yyyy-MM-dd"格式的日期字符串。
     */
    public static String getHyphenDate() {
    	SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
    	return formatter.format(new Date());
    }

    /**
     * 获取日期字符串。
     * 
     * <pre>
     *  日期字符串格式： yyyy-MM-dd
     *  其中：
     *      yyyy   表示4位年。
     *      MM     表示2位月。
     *      dd     表示2位日。
     * </pre>
     * 
     * @param date
     *                需要转化的日期。
     * @return String "yyyy-MM-dd"格式的日期字符串。
     */
    public static String getHyphenDate(Date date) {
    	SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
    	return formatter.format(date);
    }

    /**
     * 将"yyyyMMdd"格式的日期字符串转换为日期对象。
     * 
     * @param source
     *                日期字符串。
     * @return Date 日期对象。
     */
    public static Date parsePlainDate(String source) {
    	SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
    	return sdf.parse(source, new ParsePosition(0));
    }

    /**
     * 将“yyyy-MM-dd”格式的日期字符串转换为日期对象。
     * 
     * @param source
     *                日期字符串。
     * @return Date 日期对象。
     */
    public static Date parseHyphenDate(String source) {
    	SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
    	return sdf.parse(source, new ParsePosition(0));
    }

    /**
     * 将指定格式的日期字符串转换为日期对象。
     * 
     * @param source
     *                日期字符串。
     * @param pattern
     *                模式。
     * @return Date 日期对象。
     */
    public static Date parseDate(String source, String pattern) {
    	SimpleDateFormat sdf = new SimpleDateFormat(pattern);
    	return sdf.parse(source, new ParsePosition(0));
    }
    

    /**
     * 将“yyyy-MM-dd”格式的日期字符串转换为“yyyyMMdd”格式的日期字符串。
     * 
     * @param source
     *                日期字符串。
     * @return String "yyyymmdd"格式的日期字符串。
     */
    public static String toPlainDate(String source) {
    	Date date = parseHyphenDate(source);
    	SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMdd");

    	return formatter.format(date);
    }

    /**
     * 将“yyyyMMdd”格式的日期字符串转换为“yyyy-MM-dd”格式的日期字符串。
     * 
     * @param source
     *                日期字符串。
     * @return String "yyyy-MM-dd"格式的日期字符串。
     */
    public static String toHyphenDate(String source) {
    	Date date = parsePlainDate(source);
    	SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");

    	return formatter.format(date);
    }

    /**
     * 获取时间戳，将日期对象转换为时间戳类型。
     * 
     * @param date
     *                日期对象
     * @return Timestamp 时间戳
     */
    public static Timestamp getTimestamp(Date date) {
    	return new Timestamp(date.getTime());
    }

    /**
     * 获取时间戳，将当前日期转换为时间戳类型。
     * 
     * @return Timestamp 时间戳
     */
    public static Timestamp getTimestamp() {
    	return new Timestamp(new Date().getTime());
    }
    
    /**
     * 
     * @param datestr
     * @param formatstr yyyy-MM-dd'T'HH:mm
     * @return
     */
    public static Timestamp getTimestamp(String datestr, String formatstr) {
    	return getTimestamp(parseDate(datestr, formatstr));
    }

    /**
     * 将“yyyyMMdd”格式的日期字符串转换为Timestamp类型的对象。
     * 
     * @param source
     *                日期字符串
     * @return Timestamp 时间戳
     */
    public static Timestamp parseTimestamp(String source) {
    	Date date = parsePlainDate(source);

    	return getTimestamp(date);
    }

    /**
     * 获得年度周期 <br>
     * Example:<br>
     * XJPDateUtil.getPeriodYear("20040229" , -1);<br>
     * XJPDateUtil.getPeriodYear("20040228" , -1);<br>
     * XJPDateUtil.getPeriodYear("20020230" , 2);<br>
     * 
     * @param source
     *                时间串
     * @param yearPeriod
     *                年度周期 -1代表本时间的上一年度,以次类推。
     * @return String 时间。
     */
    public static String getPeriodYear(String source, int yearPeriod) {
		 int p = Integer.parseInt(source.substring(0, 4)) + yearPeriod;
		 String newYear = String.valueOf(p)
		  + source.substring(4, source.length());
		 Date date = parsePlainDate(newYear);
		 String s = getDate(date);
		 int ny = Integer.parseInt(s);
		 int sy = Integer.parseInt(newYear);
		
		 while (ny > sy) {
		     sy--;
		     ny = Integer.parseInt(getDate(parsePlainDate(String.valueOf(sy))));
		 }
		
		 return String.valueOf(sy);
    }

    /**
     * 获取当前日期和时间
     * 
     * @return String
     */
    public static String getCurrentDateStr() {
		 Date date = new Date();
		 String str = null;
		 SimpleDateFormat df = new SimpleDateFormat("yyyyMMdd HH:mm:ss");
		 str = df.format(date);
		 return str;
    }
    
    /**
     * 获取当前年月日时分秒毫秒
     * 
     * @return String
     */
    public static String getDateStr(Date date) {
		 String str = null;
		 SimpleDateFormat df = new SimpleDateFormat("yyyyMMddHHmmssSSS");
		 str = df.format(date);
		 return str;
    }
    /**
     * 日期相加
     *
     * @param day
     *             天数
     * @return 返回相加后的日期
     */
    public static String addDate(int day) {
		 java.util.Calendar c = java.util.Calendar.getInstance();
		
		 c.setTimeInMillis(System.currentTimeMillis() + ((long) day) * 24 * 3600 * 1000);
		 SimpleDateFormat df = new SimpleDateFormat("yyyyMMdd HH:mm:ss");
		 return df.format(c.getTime());
    }
    
    public static Date addSecond(int sec) {
    	java.util.Calendar c = java.util.Calendar.getInstance();
		c.setTimeInMillis(System.currentTimeMillis() + ((long) sec) * 1000);
		return c.getTime();
    }

    /**
     * 返回毫秒
     * 
     * @param date
     *             日期
     * @return 返回毫秒
     */
    public static long getMillis(java.util.Date date) {
		 java.util.Calendar c = java.util.Calendar.getInstance();
		 c.setTime(date);
		 return c.getTimeInMillis();
    }
    /**
     * 获取当前日期和时间
     * @param format 日期格式 例：yyyy-MM-dd hh:mm
     * @return String
     */
    public static String getNowDate(String format) {
		 Date date = new Date();
		 String str = null;
		 SimpleDateFormat df = new SimpleDateFormat(format);
		 str = df.format(date);
		 return str;
    }
    /**
     * 将strmon的日期减小一个月
     * @param mon
     * @return
     */
    @SuppressWarnings("deprecation")
	public static String getReduceMonDate(String strmon) {
		 if (strmon != null && !strmon.equals("")) {
		     Date mon = parseHyphenDate(strmon);
		     mon.setMonth(mon.getMonth() - 1);
		     return getHyphenDate(mon);
		 } else {
		     return "";
		 }
    }
  
  public static String getTimeStr(){
      String str="";
      SimpleDateFormat df = new SimpleDateFormat("HH:mm:ss");
      str = df.format(new Date());
      return str;
  }
}
